/**
 * 
 */
package com.proyecto.admisiones.modelo.servicios;

import java.util.List;

import org.hibernate.exception.ConstraintViolationException;

import com.proyecto.admisiones.modelo.dto.Admisiones;
import com.proyecto.core.Utilidades.ObtenerFecha;
import com.proyecto.core.Utilidades.UtilConversion;
import com.proyecto.core.modelo.echo.constantes.TipoBusqueda;
import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.ServicioGenerico;
import com.proyecto.histoclin.modelo.dto.CorrelativosHistoclinId;
import com.proyecto.histoclin.modelo.servicios.ServicioCorrelativosHistoclin;
import com.proyecto.personas.modelo.dto.Personas;

/**
 * @author vico
 *
 */
public class ServicioAdmisiones extends ServicioGenerico {

	/**
	 * 
	 */
	ServicioCorrelativosHistoclin servicioCorrelativosHistoclin;
	public ServicioAdmisiones() {
		// TODO Auto-generated constructor stub
	}
	

	
	@Override
	public void incluir(Object pojo, boolean iniciaTransaccion) throws GeneralException {
		// TODO Auto-generated method stub
		//super.incluir(pojo, iniciaTransaccion);
		
		Admisiones objAdmisiones = (Admisiones)pojo;

		if (isValidacionActiva()){
			validacion.incluir(objAdmisiones);
		}
		
		
		try {
			
			String proxNumero = servicioCorrelativosHistoclin.obtenerProximoNumeroComoString(
					new CorrelativosHistoclinId (objAdmisiones.getId().getCiaopr(), "ADMISIONES","adminsioncod" ) ,true);

			objAdmisiones.getId().setAdminsioncod( Integer.parseInt(proxNumero) );

			super.incluir(objAdmisiones, iniciaTransaccion);
			
			
		} catch (org.springframework.dao.DataIntegrityViolationException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.PropertyValueException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.datoRequeridoVacio");
			} else if (e.getMostSpecificCause() instanceof ConstraintViolationException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.registroDuplicado");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");

		} catch (org.springframework.dao.DataAccessResourceFailureException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.exception.JDBCConnectionException) {
				throw new GeneralException(
						"error." + claveProperties + ".conexion");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");
		} catch (Exception e) {
			System.err.println(":::ServicioHistoriasClinicas::: " + e.getMessage());
			if("advertencia.HistoriasClinicas.datosBasicos.HistoriasClinicas.modificar.BloqueoOptimista".equals(e.getMessage())){
				throw new GeneralException(	e.getMessage());
			}else{
				throw new GeneralException(
						"error." + claveProperties + ".desconocido");
			}
		}
		
	}
	
	public Integer consultarAdmisionExistentePaciente(Personas persona){
		List<Admisiones> objAdmisiones = null;
		
		Integer adminsioncod = -1;
		
		try{
			String[] atributo = {"id.ciaopr", "nropersona","finalizada"};
		    Object[] valor = {persona.getId().getCiaopr(), persona.getId().getNropersona(), "N"};
		    objAdmisiones = this.buscarCatalogoPorPropiedad(atributo, valor, TipoBusqueda.OPE_IGUAL);
		    adminsioncod = objAdmisiones.get(0).getId().getAdminsioncod();

		}catch (GeneralException e) {
			System.out.println("consultarAdmisionExistentePaciente:: " + e.getClaveMensaje());
		}
		
		return adminsioncod;
	}
	
	public Admisiones consultarObjAdmision(Personas persona){
		List<Admisiones> lstAdmisiones = null;
		Admisiones objAdmisiones = null;
		//Integer adminsioncod = -1;
		
		try{
			String[] atributo = {"id.ciaopr", "nropersona","finalizada"};
		    Object[] valor = {persona.getId().getCiaopr(), persona.getId().getNropersona(), "N"};
		    lstAdmisiones = this.buscarCatalogoPorPropiedad(atributo, valor, TipoBusqueda.OPE_IGUAL);
		    //adminsioncod = lstAdmisiones.get(0).getId().getAdminsioncod();
		    objAdmisiones = lstAdmisiones.get(0);
		    
		}catch (GeneralException e) {
			System.out.println("consultarAdmisionExistentePaciente:: " + e.getClaveMensaje());
		}
		
		return objAdmisiones;
	}
	
	public void cerrarAdmision(Personas persona) throws GeneralException {
		Admisiones objAdmisiones = consultarObjAdmision(persona);
		objAdmisiones.setFchadmfin(ObtenerFecha.ObtenerFechaSistemaYYYYMMDD());
		objAdmisiones.setHoraadmfin(ObtenerFecha.ObtenerHoraSistema());
		objAdmisiones.setFinalizada(UtilConversion.VALOR_CIERTO);
		try {
			modificar(objAdmisiones,true);	
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println("e.cerrarAdmision:: " + e.getMessage());
		}
	}
	
	public ServicioCorrelativosHistoclin getServicioCorrelativosHistoclin() {
		return servicioCorrelativosHistoclin;
	}
	public void setServicioCorrelativosHistoclin(
			ServicioCorrelativosHistoclin servicioCorrelativosHistoclin) {
		this.servicioCorrelativosHistoclin = servicioCorrelativosHistoclin;
	}

}
